package com.cskaoyan.javase.oop1._13block._2building;

/**
 * 根据构造代码块的特点，分析一下它的实际使用场景
 * 构造代码块最大的特点就是其中的代码会最终加入构造，所以依据这一点：
 *
 * 我们可以“提取公因式”一样的，把所有构造器都需要执行的代码，放入构造代码块中
 * 其次，构造代码块毕竟是给成员变量赋值用的，所以：
 *
 * 如果需要很复杂的代码完成成员变量的赋值（如果只是给一个值，用显式赋值和构造器足矣）
 *
 * 比如需要一个算法，需要一定计算等等。在这些场景下，使用构造代码块是一个不错的选择
 *
 * @since 10:19
 * @author wuguidong@cskaoyan.onaliyun.com
 */
public class Demo4 {
    public static void main(String[] args) {
        // 需求：统计A new对象创建的次数
        /*
            1.需要一个count计数器，这个变量应该是类A的静态成员变量
            2.构造器中应该加一个count++，由于有多个构造器，所以可以把这条语句加到构造代码块中
         */
        for (int i = 0; i < 5; i++) {
            new A();
            new A(19);
        }
        System.out.println(A.count);
    }
}

class A {
    int a;
    static int count = 0;

    {
        count++;
    }

    public A() {
        // count++;
    }

    public A(int a) {
        this.a = a;
        // count++;
    }
    // 每创建一个对象，都需要执行test方法，就直接在构造代码块中调用就可以了
    public void test(){}
}